Implementación de NAT

  • Siempre recalcular el checksum y setearlo al paquete como último paso antes de finalizar el procesamiento.
  • La tabla debe mantener IP_priv, PORT_priv, IP_publ, PORT_publ, PROTOCOLO
    • PORT_x puede ser también el identificador ICMP
    • Los protocolos son TCP, UDP e ICMP. Esto es porque pueden existir sesiones TCP con el mismo puerto que una sesion UDP.

Implementación de Forwarding

  • Chequear TTL y decrementarlo. Si TTL no es mayor a 1, se debe enviar el mensaje ICMP con TTL Expire.
  • Longest Prefix Match a menos que digan lo contrario.
  • Detectar multicast sabiendo que una dir. de multicast siempre comienza con 1110.

Sockets

  • Cerrarlos apenas pueda (especialmente UDP)
  • Para el server TCP, poner un client.close() luego del while(true) aunque parezca que nunca se va a ejecutar.

Simular una captura de paquetes en una interfaz:

  • Si hay una conexión TCP, capturar el acuerdo en tres pasos inicial (SYN, SYN-ACK, ACK) y el cierre de conexión (FIN-ACK-FIN-ACK).
  • Capturar ARP solo si no hay tablas cacheadas.
  • Capturar DNS si los mensajes son hacia un hostname.
  • Diferenciar HTTP GET de Response

HTTP y la web

  • Una url puede incluir el número de puerto a consultar luego del nombre de dominio. El formato sería: {nomb_dominio | ip}:{num_puerto?}/{path_objeto_consultado}
  • Generalmente conviene implementar una op. 'obtener_objeto' y luego llamarla varias veces a lo largo del programa. Ojo si es HTTP/1.1.
  • El get es del siguiente formato:
    • GET /index.html HTTP/1.1
  • Para separar los header del contenido útil buscar "\r\n\r\n" .
  • Las respuestas del servidor tienen como primer linea algo del estilo:
    • HTTP/1.1 200 OK.

DHCP

  • Cada vez que un host se une a la red, el servidor DHCP asigna una dirección arbitraria de su conjunto actual de direcciones disponibles; cada vez que un host abandona la red, su dirección es devuelta al conjunto.